#include <func.h>

#define N 1000

int main()
{
    int shmid;
    shmid=shmget(1000,4096,0600|IPC_CREAT);
    ERROR_CHECK(shmid,-1,"shmid");
    int *p=(int*)shmat(shmid,NULL,0);
    p[0]=0;
    int sem_id=semget(1000,1,IPC_CREAT|0600);
    ERROR_CHECK(sem_id,-1,"semget");
    int ret=semctl(sem_id,0,SETVAL,1);
    ERROR_CHECK(sem_id,-1,"semctl");
    struct sembuf q;
    q.sem_num=0;
    q.sem_op=-1;
    q.sem_flg=SEM_UNDO;
    struct sembuf V;
    V.sem_num=0;
    V.sem_op=1;
    V.sem_flg=SEM_UNDO;
    if(!fork())
    {
        int i;
        for(i=0;i<N;i++)
        {
            semop(sem_id,&q,1);
            p[0]++;//非原子操作（需要时间）
            semop(sem_id,&V,1);
        }
        exit(0);
    }else{
        int i;
        for(i=0;i<N;i++)
        {
            semop(sem_id,&q,1);
            p[0]++;//非原子操作（需要时间）
            semop(sem_id,&V,1);
        }
        wait(NULL);
        printf("p[0]=%d\n",p[0]);
        return 0;
    }
}